package base.innerclass;

// 匿名内部类
public class T2 {

    public static void main(String[] args) {
        new Outer02().m1();
    }
}

class Outer02 {
    public void m1() {

        // 匿名内部类(基于接口)
        // 编译类型： 接口 IA
        // 运行类型： 匿名内部类
        // jdk底层在创建完匿名内部类之后马上就创建了实例，然后把地址返回给ia
//        IA ia = new IA() {
//            @Override
//            public void cry() {
//                System.out.println("嗷嗷嗷~");
//            }
//        };
//        ia.cry();


        // 匿名内部类(基于普通类)
        // 编译类型： Fa
        // 运行类型： 匿名内部类
        Fa fa = new Fa("111"){
            @Override
            public void test() {
                System.out.println("匿名内部类重写的方法");
            }
        };
        fa.test();

        // 匿名内部类(基于抽象类)
        Animal dog = new Animal() {
            @Override
            void eat() {
                System.out.println("吃饭了");
            }
        };
        dog.eat();



        // lambda 表达式,必须是函数式接口
        IA ia = () -> {
            System.out.println("嗷嗷嗷~");
        };
        ia.cry();

    }
}

interface IA  {
    void cry();
}

class Fa {
    String name;
    Fa(String name){
        this.name = name;
    }
    public void test(){
        System.out.println("Fa test");
    }
}

abstract class Animal{
    abstract void eat();
}
